package com.zhongwang.mms.module.buy.dao;

import com.zhongwang.mms.module.buy.model.BPreOrderPlan;
import com.zhongwang.mms.module.buy.model.ShoppingPlanModel;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 预购计划表持久层
 */
@Repository
public interface BPreOrderPlanDao {

    /**
     * 插入 预购明细数据
     * @param bPreOrderPlan 预购明细
     * @return 插入数据条数
     */
    Integer insert(BPreOrderPlan bPreOrderPlan);

    /**
     * 批量插入 预购明细数据
     * @param bPreOrderPlanList 预购明细
     * @return 插入数据条数
     */
    Integer insertList(@Param("list") List<BPreOrderPlan> bPreOrderPlanList);

    /**
     * 根据条件查询列表
     * @param where 查询条件
     * @return 查询储的结果
     */
    List<BPreOrderPlan> selectList(BPreOrderPlan where);
    /**
     * 根据预购编号code查询预购计划列表
     * @param code 预购编号
     * @return 预购计划列表
     */
    List<BPreOrderPlan> selectListByCode(@Param("code") String code);

    /**
     * 根据主键获取对应的预购计划数据
     * @param id 主键
     * @return 对应的预购计划数据
     */
    BPreOrderPlan selectByPrimaryKey(@Param("id") Integer id);

    /**
     * 根据 code 和 不在id的集合字符串为条件删除预购计划
     * @param code 预购编码
     * @param idStr id字符串
     * @return 删除的数量
     */
    Integer deleteByCodeAndNotHaveIdStr(@Param("code") String code,@Param("idStr") String idStr);
    /**
     * 根据 code 和 不在id的集合字符串为条件查询预购计划
     * @param code 预购编码
     * @param idStr id字符串
     * @return 预购计划
     */
    List<BPreOrderPlan> selectLitByCodeAndHaveIdStr(@Param("code") String code,@Param("idStr")  String idStr);
    /**
     * 根据主键ID更新预购数据
     * @param bPreOrderPlan 主键ID和更新的数据
     * @return 更新的数据条数
     */
    Integer updatePreOrder(BPreOrderPlan bPreOrderPlan);

    /**
     * 根据ID更新状态
     * @param bPreOrderPlan id 和 状态
     * @return 更新数量
     */
    Integer updatePreOrderStatus(BPreOrderPlan bPreOrderPlan);

    /**
     * 根据审核者查询可以被本级别审核的数据
     * @param where
     * @return
     */
    List<BPreOrderPlan> selectListWithReportCheck(BPreOrderPlan where);

    /**
     * 查询采购计划列表 -- 明细表 -- 普通搜索
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> selectProcurementPlanByWhere(BPreOrderPlan where);

    /**
     * 预购明细列表 -- 明细模式 -- 普通搜索
     *
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> selectDetailsProcurementPlanByQuery(BPreOrderPlan where);
    /**
     * 查询采购计划列表 -- 明细表 -- 高级搜索
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> findProcurementPlanByQueryForAdvanceList(BPreOrderPlan where);
    /**
     * 查询预购明细列表 -- 明细模式 - 高级搜索
     *
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> findDetailsProcurementPlanByQueryForAdvanceList(BPreOrderPlan where);

    /**
     * 根据物料跟踪码获取采购计划
     * @param where
     * @return
     */
    BPreOrderPlan selectProcurementPlanByWheredTrackNumber(BPreOrderPlan where);
    /**
     * 查询采购计划列表 -- 汇总表
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> selectProcurementSummaryListPlanByWhere(BPreOrderPlan where);
    /**
     * 查询采购计划列表 -- 汇总模式
     * @param where 搜索条件
     * @return 采购计划列表
     */
    List<BPreOrderPlan> selectDetailsProcurementSummaryListPlanByWhere(BPreOrderPlan where);

    /**
     * 更新状态和指派的业务员ID
     * @param bPreOrderPlan
     * @return
     */
    Integer updatePreOrderStatusAndAssignPurchaserId(BPreOrderPlan bPreOrderPlan);

    /**
     * 根据主键更新导出记录
     * @param preOrderPlan
     * @return
     */
    Integer updateExportRecordByPrimaryKey(BPreOrderPlan preOrderPlan);

    /**
     * 根据物料跟踪号更新采购信息
     * @param bPreOrderPlan 采购信息
     * @return 更新操作数据量
     */
    Integer updateProcurementPlanByTrackNumber(BPreOrderPlan bPreOrderPlan);

    /**
     * 根据跟踪号修改收货状态
     * @param trackNumbers 物料跟踪号集合
     * @param receiptStatus 收缩状态值
     * @return 操作数据量
     */
    Integer updateProcurementPlanReceiptStatusByTrackNumberList(@Param("list") List<String> trackNumbers,@Param("receiptStatus") Integer receiptStatus);
    /**
     * 根据物料跟踪号集合撤销采购
     * @param trackNumbers 物料跟踪号集合
     * @return 操作结果
     */
    Integer revocationProcurementByTrackNumber(@Param("list") List<String> trackNumbers);
    /**
     * 根据物料跟踪号获取物料跟踪号是空的采购计划数量
     * @param trackNumbers 物料跟踪号几号
     * @return 跟踪号是空的采购计划数量
     */
    Integer getPcNoNullCountByTrackNumber(@Param("list") List<String> trackNumbers);

    /**
     * 根据物料跟踪号更新采购信息中的收货数量
     * @param bPreOrderPlan 采购信息收获数量以及主键
     * @return 更新操作数据量
     */
    Integer updateProcurementPlanReceivedNumByTrackNumber(BPreOrderPlan bPreOrderPlan);

    /**
     * 根据物料跟踪号更新指定业务员
     * @param bPreOrderPlan
     * @return
     */
    Integer updateBPreOrderPlanAssignPurchaserIdAndRejectReason(BPreOrderPlan bPreOrderPlan);
}
